package com.muyu.payment.mapper;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.muyu.payment.domain.PaymentTransaction;
import org.apache.ibatis.annotations.*;

import java.util.Date;
import java.util.List;

/**
 * 交易记录Mapper接口
 * 
 * @author muyu
 * @since 2025-09-15
 */
@Mapper
public interface PaymentTransactionMapper extends BaseMapper<PaymentTransaction> {
    
    /**
     * 根据交易编号查询交易记录
     *
     * @param transactionNo 交易编号
     * @return 交易记录
     */
    PaymentTransaction selectByTransactionNo(@Param("transactionNo") String transactionNo);
    
    /**
     * 根据渠道交易号查询交易记录
     *
     * @param channelTradeNo 渠道交易号
     * @return 交易记录
     */
    PaymentTransaction selectByChannelTradeNo(@Param("channelTradeNo") String channelTradeNo);
    
    /**
     * 根据订单号查询交易记录
     *
     * @param orderNo 订单号
     * @return 交易记录
     */
    PaymentTransaction selectByOrderNo(@Param("orderNo") String orderNo);
    
    /**
     * 更新交易状态
     *
     * @param transactionNo 交易编号
     * @param status 状态
     * @param channelResponse 渠道返回结果
     * @return 更新记录数
     */
    int updateStatus(@Param("transactionNo") String transactionNo, 
                    @Param("status") Integer status, 
                    @Param("channelResponse") String channelResponse);
    
    /**
     * 分页查询交易记录
     *
     * @param page 分页参数
     * @param queryWrapper 查询条件
     * @return 分页结果
     */
    IPage<PaymentTransaction> selectPageVo(IPage<PaymentTransaction> page, 
                                         @Param(Constants.WRAPPER) Wrapper<PaymentTransaction> queryWrapper);
    
    /**
     * 查询指定状态的交易记录
     *
     * @param status 状态
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 交易记录列表
     */
    List<PaymentTransaction> selectByStatusAndTimeRange(@Param("status") Integer status,
                                                      @Param("startTime") Date startTime,
                                                      @Param("endTime") Date endTime);
    
    /**
     * 查询超时未处理的交易记录
     *
     * @param timeoutMinutes 超时时间（分钟）
     * @return 交易记录列表
     */
    List<PaymentTransaction> selectTimeoutTransactions(@Param("timeoutMinutes") int timeoutMinutes);
    
    /**
     * 根据交易号逻辑删除
     *
     * @param transactionNo 交易号
     * @return 删除结果
     */
    int deleteByTransactionNo(@Param("transactionNo") String transactionNo);
}
